/*
 * Clase que procesa una pagina HTML
 * 
 * @author HPCIII_Team2013
 */

package cl.ucn.hpc.procesamiento;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HTMLProcessing implements Serializable {
	//Creado automaticamente por java para clases serializables
	private static final long serialVersionUID = 2222491060054527907L;

	/*
	 * Contructor de la clase
	 */
	public HTMLProcessing() {

	}

	/*
	 * Elimina las anotaciones HTML de la pagina recibida
	 * 
	 * @param f Archivo con la pagina recibida
	 * @return Texto de la pagina sin anotaciones HTML
	 * @throws IOException Si ocurre un error con InputStream
	 */
	public static String extractText(File f) throws IOException {

		FileInputStream stream = new FileInputStream(f);
		try {
			Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF8")));
			StringBuilder builder = new StringBuilder();
			char[] buffer = new char[8192];
			int read;
			while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
				builder.append(buffer, 0, read);
			}

			return extractText(builder.toString());

		} finally {

			stream.close();
		}

	}

	/*
	 * Extrae las anotaciones HTML del texto recibido
	 * 
	 * @param f Texto que contiene anotaciones HTML
	 * @return Texto sin anotaciones HTML
	 */
	public static String extractText(final String f) {
		if (f == null || f.isEmpty()) {
			return null;
		}
		String results = Jsoup.parse(f).text();

		return results;
	}

	/*
	 * Extrae los links de la pagina recibida
	 * 
	 * @param f Archivo con la pagina recibida
	 * @return Listado con los links de las paginas encontradas
	 * @throws IOException Si no puede crear el FileInputStream
	 */
	public static List<String> extractLinks(final File f) throws IOException {
		FileInputStream stream = new FileInputStream(f);
		try {
			Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF8")));
			StringBuilder builder = new StringBuilder();
			char[] buffer = new char[8192];
			int read;
			while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
				builder.append(buffer, 0, read);
			}

			return extractLinks(builder.toString());

		} finally {

			stream.close();
		}
	}

	/*
	 * Extrae los links del texto recibido
	 * 
	 * @param f Texto que puede contener links
	 * @return Lista con los links de las paginas encontradas
	 */
	public static List<String> extractLinks(final String f) {
		if (f == null || f.isEmpty()) {
			return null;
		}

		Document doc = Jsoup.parse(f);

		Elements links = doc.select("a[href]");

		List<String> urls = new ArrayList<String>();

		for (Element link : links) {
			String l = link.attr("abs:href");
			if (l != null & !l.isEmpty()) {
				urls.add(l);
			}
		}

		return urls;
	}

	/*
	 * Extrae los links de las imagenes contenidas en la pagina recibida
	 * 
	 * @param f Archivo que contiene la pagina recibida
	 * @return Lista con los links de las imagenes encontradas
	 * @throws IOException Si no puede crear el InputStream 
	 */
	public static List<String> extractImageUrl(final File f) throws IOException {

		FileInputStream stream = new FileInputStream(f);
		try {
			Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF8")));
			StringBuilder builder = new StringBuilder();
			char[] buffer = new char[8192];
			int read;
			while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
				builder.append(buffer, 0, read);
			}

			return extractImageUrl(builder.toString());

		} finally {

			stream.close();
		}
	}

	/*
	 * Extrae los links de las imagenes contenidas en el texto recibido
	 * 
	 * @param f Texto que puede contener vinculos de imagenes
	 * @return Lista con los links de las imagenes encontradas
	 */
	public static List<String> extractImageUrl(final String f) {

		if (f == null || f.isEmpty()) {
			return null;
		}
		Document doc = Jsoup.parse(f);

		Elements media = doc.select("[src]");

		List<String> urls = new ArrayList<String>();

		for (Element link : media) {

			String l = link.attr("abs:src");
			if (l != null & !l.isEmpty()) {
				urls.add(l);
			}
		}

		return urls;
	}
}
